#!/usr/bin/env python
# coding: utf-8

"""
GPS Coordinate Generator
Function: Generate 120 randomly distributed GPS coordinates within 50 meters of the specified center point
Output format: Conforms to GPS_t structure format
"""

import random
import math

# 地球半径（米）
EARTH_RADIUS = 6378137.0

# 中心点经纬度
CENTER_LATITUDE = 53.555266
CENTER_LONGITUDE = 118.773375

# 要生成的坐标数量
NUM_POINTS = 120

# 生成的坐标的范围限制
RANGE_LIMIT = 50

def generate_random_point(center_lat, center_lng, radius):
    """
    围绕指定中心点生成随机分布的GPS坐标

    入参：
        center_lat: 中心纬度
        center_lng: 中心经度
        radius: 范围半径 (米)
        
    返回：
        (纬度, 经度): 生成的随机的坐标点
    """
    # 随机生成距离 (从 0 到 RANGE_LIMIT)
    # 使用平方根确保在中心点分布
    random_distance = radius * math.sqrt(random.random())
    
    # 随机生成角度 (从 0 到 360 °)
    random_angle = random.uniform(0, 2 * math.pi)
    
    # 计算纬度偏移量 (南/北)
    # 1纬度约等于111公里
    lat_offset = random_distance * math.cos(random_angle) / 111000.0
    
    # 计算经度偏移量 (东/西)
    # 1度经度的距离随着纬度变化
    lng_offset = random_distance * math.sin(random_angle) / (111000.0 * math.cos(math.radians(center_lat)))
    
    # 计算新坐标点
    new_lat = center_lat + lat_offset
    new_lng = center_lng + lng_offset
    
    return (new_lat, new_lng)

def format_gps_point(lat, lng):
    """
    将GPS坐标点格式化为指定的输出格式
    
    入参：
        lat: 纬度
        lng: 经度
        
    返回:
        formatted_str: 格式化后的数据
    """
    return f"    {{{{{lat:.7f}, {lng:.7f}}}}},"

def generate_gps_coordinates():
    """
    生成指定数量的GPS坐标点并保存到文件
    """
    # 创建输出文件
    with open("gps_coordinates.c", "w") as f:
        # 写入文件头
        f.write("// Auto-generated GPS coordinate points\n")
        f.write("// Center point: Latitude = {}, Longitude = {}\n".format(CENTER_LATITUDE, CENTER_LONGITUDE))
        f.write("// Range: {} meters\n\n".format(RANGE_LIMIT))
        
        # 写入数组开头
        f.write("const float gps_coordinates[][2] = {\n")
        
        # 生成并写入坐标点
        for i in range(1, NUM_POINTS + 1):
            lat, lng = generate_random_point(CENTER_LATITUDE, CENTER_LONGITUDE, RANGE_LIMIT)
            gps_str = format_gps_point(lat, lng)
            f.write(gps_str + "\n")
        
        # 写入数组结尾
        f.write("};\n")
            
        print(f"Successfully generated {NUM_POINTS} GPS coordinate points, saved to gps_coordinates.c file")

if __name__ == "__main__":
    generate_gps_coordinates()